ソースジェネレータ RING ――――――――――――――――――――――――――――――――――――――― Oh!X 1989年 5月号掲載 S−OS SWORD マシン語  RING.SOS   03000H−048A5H S:03000H SOURCERY変更プログラム マシン語  SOURCERY2RING.SOS   08000H−081E8H S:08000H REDA用ソース  SOURCERY2RING.ASC 起動方法 RING.SOSをロード J3000 コールドスタート 03000H ホット スタート 03003H *SOURCERY変更プログラムは使用しません ――――――――――――――――――――――――――――――――――――――― 全機種共通S−OS“SWORD”要 ソースジェネレータ  R I N G オブジェクトプログラムから、 アセンブラにかかる ソースプログラムを作り出すのが ソースジェネレータ。 12月号で発表したSOURCERYが REDA対応になりました。 簡単なプログラムで変更でき、 従来のZEDA用にも使用できます。 ・―               ―・ |  新しいソースジェネレータ   | ・―               ―・ 1988年12月号で発表されたSOURCERYは、 使いやすく高遠なソースジェネレータでした。 しかし作成するソースが、 ZEDAのマクロ表記に対応しているため、 その後発表されたREDAでは SOURCERYで作成されたソースを、 直接使うわけにはいきません。 また、マクロの途中にラベルを生成できない、 マクロの動作が不安定(動く人と動かない人がいる)なので SOURCERYのマクロ機能をはずし、 REDAでも直接扱えるソースを作成する 新しいソースジェネレータ、RINGを発表します。 ・―               ―・ |    プログラムの内容     | ・―               ―・ このRINGというプログラムは、 SOURCERYを改造して作られています。 こうすると、新しく1本のプログラムを作るより 開発の時間がきわめて短くなるからです。 RINGはREDAに完全対応ということで、 出力されるソースは、 完全にZ80のザイログニーモニックです。 もちろん出力するソースコードに タブコードを使わなければ、 従来どおりZEDAやEDASMなどの アセンブラで使用できるソースを作成することも可能です。 RINGは、マクロをはずしたほかに出力する ソースのスペースにタブコードを使うこともできるので、 REDAを使う場合には ソースのサイズを小さくすることもできます。 ・―               ―・ |      入力方法       | ・―               ―・ RINGはSOURCERYを改造して作られていますので、 プログラムの90%はSOURCERYと同じです。 SOURCERYをすでに入力した人は、 プログラムを一部変更するだけで RINGを作成することができます。 ただし、変更個所が結構多いので、 プログラムを直接変更するのではなく、 専用の変更プログラムを用意しました。 SOURCERYをメモリにロードしてから、 変更プログラムを実行すると、 一瞬にしてパッチ当てが終了します。 また、SOURCERYを持っていない人は、 本体プログラムのダンプリストを入力してください。 入力は、MACINTO−Cなどのツールや 各機種のモニタを使うと便利でしょう。 入力が終わったら、3000H〜48A5Hまでの範囲を セーブしてください。 実行は3000Hがコールドスタート、 3003Hがホットスタートです。 ・―               ―・ |       使い方       | ・―               ―・ 使用方法はSOURCERYと、 基本的な部分はまったく変わりません。 コマンドもタブスイッチが追加になっただけですが、 SOURCERYを持っていない人もいるので、 ひととおり説明しておきましょう。 RINGを起動すると、画面にプロンプト とカーソルを表示してキーの入力待ちになります。 ここで、以下のコマンドを入力することができます。 L[*or/] adr1 adr2 adr1とadr2で指定した範囲を逆アセンブルします。 Lの直後に*をつけることによって、メモリ上にソースを作成します。 また、*の代わりに/をつけると、ソースの作成を行いながら、 同時に画面に逆アセンブルしたリストを出力します。 N Lコマンドでソースの作成中に、メモリ不足でエラーが発生したり、 ブレイクで中断したときにこのコマンドを実行すると、 中断した直後から逆アセンブルを再開します。 なお、ソース作成中は、このコマンドを実行すると それまで作成されたソースを破壊すると それまで作成されたソースを破壊するので、 このコマンドを実行する前にSコマンドで 途中まで作成されたソースをセーブしておきましょう。 X[adr] L、Nコマンドで作成するソースの格納アドレスを設定します。 アドレス値を省略すると、 現在格納されているソースの先頭、終了アドレスを表示します。 O adr L、M、D、Fコマンドでのオフセットアドレスを指定します。 たとえば、3000Hで動作するプログラムを、 A000Hから読み込んでいる場合は、   O7000   L3000 とすれば、3000Hから動作するプログラムとして逆アセンブルができます。 M[BorWorMorS][adr1 adr2] 指定エリアをデータエリアとして登録します。 MB、MW、MM、MSの各コマンドで登録された部分はそれぞれ、 DB、DW、DM、DSの形式でデータとして出力されます。 アドレスを省略すると、現在登録されているデータエリアと形式を表示します。 &[adr] Mコマンドで定義していたデータエリアの登録を解除します。 アドレスを省略すると、すべてのデータエリアの登録を解除します。 C[adr][CODE][SIZE] S−OSの#MPRNTのような、CALL文の直後にデータを置くサブルーチン (かりに特殊サブルーチンと呼ぶ)の指定/解除を行います。 登録は、   C adr SIZE     (1)   C adr 00 CODE  (2) のような形式で行います。 (1)では、指定されたアドレスに続くSIZEバイト分のエリアを データとしてみなし、 (2)では後続のデータ数が不定であるサブルーチンに適応するもので、 データ数を0として、 CODEで、データのエンドコードを指定しています (データは16進2桁で指定)。 たとえば、S−OSの#MPRNTを登録しようとしたら、   C1FE2 00 00 と入力すればいいことになり、 同じくS−OSの#PAUSEを登録するときは、   C1FC7 02 と入力すればいいわけです(この2つは、あらかじめ登録されています)。 また、アドレスだけを指定すると、 それまでにCコマンドで登録されていたサブルーチンの解除を行います。 S filename 作成したソースを、指定したファイルネームでセーブします。 D adr1[adr2] アドレスで指定した範囲のダンプリストを表示します。 最終アドレスを省略すると、最初の 128バイトだけ表示します。 表示内容は、そのままカーソルエディットが可能です。 F adr1 adr2 DATA… 指定範囲から、DATAをサーチし、アドレスとともに出力します。 データは複数個指定可能で、 16進数かダブルクォーテーションでくくった文字列で指定します。 J adr 指定したアドレスにジャンプします。 # このコマンドを実行するたびにプリンタヘの出力をON/OFFします。 ! S−OSのホットスタートヘジャンプします。 T このコマンドはSOURCERYからRINGに新しく追加されたコマンドです。 このコマンドを実行するたびに、 出力するソースにタブコードを使うか使わないか、切り換えを行います。 ・―               ―・ |   RINGのソース作成    | ・―               ―・ 基本的には、12月号のSOURCERYのソースの作り方と同じですが、 タブコード対応になって、特殊サブルーチンが増えたりしているので、 もう一度説明しておきます。 まず、データエリアの設定を以下のように行ってください。   MB39C9 39CA   MM44AE 4714   MB4715 4728   MW4729 476C   MB476D 478C   MS478D 47FF   MB48A5 次に特殊サブルーチンのセットを次のように行います。   C4069 00 00   C415B 00 00   C4800 00 00 これで、準備ができました。 なお、メモリに余裕のある機種では、 本体プログラムとは別にソースジェネレート用に RINGを5000Hからロードしておき、   O2000   X6900 としておけば、ワークエリアの内容を壊す心配がありません。 準備がてきたら、   L/3000 48A5 で、ソースが作成されます。 途中でメモリオーバーになったら、 Sコマンドでセーブしてから、 Nコマンドでソースジェネレートを再開してください。 ・―               ―・ |       最後に       | ・―               ―・ S−OSのプログラム開発環境は、 すでにZEDAを中心とした十分なものが確立しています。 それはそれでいいのですが、 新しくREDAが発表されたのにともない、 これまでのZEDAを中心とした環境だけでは 不便を感じるようになってきました。 そこで、多少付け焼き刃的ではありますが、 手近にあった、SOURCERYを REDA対応に改造することになったわけです。 その結果として、プログラムがつぎはぎだらけになってしまい、 とても見にくくなったことについては、 RINGの母体であるSOURCERYの作者の白方さんに、 とても申し訳なく思っています。 なにしろ多量のパッチ当ての結果、 実行されることのなくなったサブルーチン群があちらこちらに現れ、 さらにスタックにデータを抱えたまま 他のサブルーチンの途中に飛び込むなど、 悪行の限りをつくしたプログラムになってしまったのですから。 しかし、これで新しい標準アセンブラREDAにも 大きな助っ人がついたことになります。 あと私がほしいのは、タブ対応のスクリーンエディタです。 REDAにもスクリーンエディタライクな 独自のエディタが用意されていますが、 せっかくアセンブラとエディタが 切り離せる仕様になっているのですから、 ちゃんとしたスクリーンエディタがあってもいいでしょう。 誰か、新しいエディタを作る人はいませんか?